package com.atguigu.edu.realtime220815.util;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author: rym
 * @Description: TODO
 * @DateTime: 2023/2/16 17:02
 **/
public class ThreadPoolUtil {
    //如果一个线程修改完成员变量，其他线程看不到，volatile是指内存的可见性
    private static volatile ThreadPoolExecutor poolExecutor;
    //懒汉
    public static ThreadPoolExecutor getInstance(){
        if(poolExecutor == null){
            //代码块，上锁，第二个线程来了一看就不创建对象了
            synchronized (ThreadPoolUtil.class){
                if(poolExecutor == null){
                    // 当前等于空创建线一个对象线程池->单例
                    poolExecutor = new ThreadPoolExecutor(
                            4,20,60*5,
                            TimeUnit.SECONDS,
                            //保证你现在你能够提交的任务一定有 run 方法？咱们是不是可以在这里我让我做个约束。
                            // 什么放到我队列里的东西，必须实现软内部接口。
                            // 如果实现软内部接口，这里边是不是肯定有咱们的方法，需要你重写？
                            //开线程池
                            new LinkedBlockingDeque<Runnable>(Integer.MAX_VALUE));
                }
            }
        }
        return poolExecutor;
    }
}

